//package com.arges.controller;
//
//
//import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpSession;
//import java.io.UnsupportedEncodingException;
//import java.net.URLDecoder;
//import java.util.HashMap;
//import java.util.Map;
//
//@RestController
//@RequestMapping("/books")
//public class login {
//
//
//    @GetMapping("/direct-access")
//    public String getDirectAccessToken(Model model, HttpSession session, HttpServletRequest request) {
//        try {
//            // 验证签名
//            String redirectUrl = URLDecoder.decode(request.getParameter("redirect_url"), "UTF-8");
//            String timestamp = request.getParameter("timestamp");
//            String code = request.getParameter("code");
//            String sign = request.getParameter("sign");
//            boolean checkSign = checkSign(timestamp, redirectUrl, sign, code,
//                    oauthConfigProps.getAppKey(), oauthConfigProps.getAppSecret());
//            if (!checkSign) {
//                throw new RuntimeException("验签失败");
//            }
//            GetDirectAccessTokenRequest req = new GetDirectAccessTokenRequest();
//            req.setCode(request.getParameter("code"));
//
//            OauthClient oauthClient = new DefaultOauthClient(
//                    oauthConfigProps.getOpenapiBaseUrl(),
//                    oauthConfigProps.getAppKey(),
//                    oauthConfigProps.getAppSecret()
//            );
//            GetDirectAccessTokenResponse response = oauthClient.execute(req);
//
//            //成功
//            if (response == null || response.getCode() != 0) {
//                log.error("没有获取到响应参数");
//                session.setAttribute("errorMsg", "没有获取到响应参数");
//                return "error";
//            } else {
//                GetDirectAccessTokenResponse.Result data = response.getData();
//
//                // 获取用户信息
//                if (this.handleReturnResults(data, oauthClient, session)) {
//                    model.addAttribute("jsonResult", oauthService.setJsonResult(session));
//                    return "index";
//                } else {
//                    return "error";
//                }
//            }
//        } catch (Exception e) {
//            log.error(e.getMessage(), e);
//            session.setAttribute("errorMsg", e.getMessage());
//            return "error";
//        }
//    }
//
//    /**
//     * 检查签名
//     *
//     * @param timestamp    时间戳
//     * @param redirectUrl  回调URL
//     * @param sign         签名
//     * @param code         授权码
//     * @param clientId     appKey
//     * @param clientSecret appSecret
//     * @return boolean 检查结果
//     */
//    private boolean checkSign(String timestamp, String redirectUrl, String sign, String code, String clientId,
//                              String clientSecret) throws UnsupportedEncodingException {
//        Map<String, String> params = new HashMap<>();
//        params.put("clientId", clientId);
//        params.put("code", code);
//        params.put("timestamp", timestamp);
//        params.put("redirectUrl", URLDecoder.decode(redirectUrl, "UTF-8"));
//        params.put(SignUtils.REQUEST_PUBLIC_PARAMS_SIGN, sign);
//
//        return SignUtils.signCheck(params, clientSecret, "UTF-8", SignUtils.SIGN_TYPE_HMAC_SHA_256);
//    }
//
//    /**
//     * 处理返回结果
//     *
//     * @param data        返回数据
//     * @param oauthClient 客户端
//     * @param session     会话
//     * @return boolean 操作结果
//     * @throws AuthApiException 身份验证api例外
//     */
//    private boolean handleReturnResults(Object data, OauthClient oauthClient,
//                                        HttpSession session) throws AuthApiException {
//        // 处理Access Token等返回结果
//        OauthDataDTO oauthDataDTO = oauthService.setOauthDataDTO(new OauthDataDTO(), data);
//        session.setAttribute("oauthData", oauthDataDTO);
//        // 处理用户信息
//        GetUserInfoRequest userInfoRequest = new GetUserInfoRequest();
//        userInfoRequest.setAccessToken(oauthDataDTO.getAccessToken());
//        GetUserInfoResponse userInfoResponse = oauthClient.execute(userInfoRequest);
//
//        if (userInfoResponse == null || userInfoResponse.getCode() != 0) {
//            log.error("没有获取到用户信息");
//            session.setAttribute("errorMsg", "没有获取到用户信息");
//            return false;
//        } else {
//            GetUserInfoResponse.Result userInfo = userInfoResponse.getData();
//
//            User user = dataService.getUserByOpenId(userInfo.getOpenid());
//            if (user == null) { // 此openid未与应用中的用户绑定
//                session.removeAttribute("user");
//                User newUser = oauthService.setUser(userInfo);
//                session.setAttribute("user", newUser);
//            } else { // 此openid已与应用中的用户绑定, 直接登录跳转
//                // 此前未获取签名而之后获取到, 需要为用户追加
//                if (userInfo.getCertInfo() != null) oauthService.checkCert(user, userInfo);
//                session.setAttribute("user", user);
//            }
//            return true;
//        }
//    }
//}
